#include "sql_list.h"

/* 初始化函数 */
int Init_Sql_List(sql_list *list)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }
    list->len = 0;
    list->max = Data_MAX;
    return 0;
}

/* 尾插函数 */
int insert_tail_sql_list(sql_list *list, Elenemt_data data)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 顺序表 是否 已满
    if (Data_MAX <= list->len)
    {
        ERRLOG("顺序表 以满");
        return EOF;
    }

    // 1 写入 数据
    list->data[list->len] = data;

    // 2 迭代 len
    list->len++;

    return 0;
}

/* 任意位置插入 */
int insert_pos_sql_list(sql_list *list, Elenemt_data data, int pos)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 顺序表 是否 已满
    if (Data_MAX <= list->len)
    {
        ERRLOG("顺序表 以满");
        return EOF;
    }
    /*
        第一种 如果插入的位置 超过 有效数据数量 则返回报错 if (pos > list->len + 1)
        第二种 如果插入的位置 超过 有效数据数量 则插入末尾 if (pos > list->len)
    */

    // 判定 插入的位置是否正常 是否大于当前的有效数据数量
    if (pos > list->len)
    {
        // 1 写入 数据
        list->data[list->len] = data;

        // 2 迭代 len
        list->len++;

        return 0;
    }

    // 任意位置插入

    for (size_t i = list->len; i > pos - 1; i--)
    {
        list->data[i] = list->data[i - 1];
    }

    // 1 写入 数据
    list->data[pos - 1] = data;

    // 2 迭代 len
    list->len++;

    return 0;
}

/* 删除 位置:尾部 */
int delete_tall_sql_list(sql_list *list)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 传入顺序表 长度 为 0
    if (0 >= list->len)
    {
        ERRLOG("数据表 的长度 为 0");
        return EOF;
    }

    // 尾删除

    memset(&list->data[list->len - 1], 0, sizeof(Elenemt_data));

    list->len--;

    return 0;
}

/* 删除 位置:任意 */
int delete_pos_sql_list(sql_list *list, int pos)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 传入顺序表 长度 为 0
    if (0 >= list->len)
    {
        ERRLOG("数据表 的长度 为 0");
        return EOF;
    }

    // 判定 删除的位置是否正常 是否大于当前的有效数据数量
    if (pos > list->len - 1)
    {
        // 尾删
        list->len--;
        return 0;
    }

    // 中间删除
    for (size_t i = pos - 1; i < list->len; i++)
    {
        list->data[i] = list->data[i + 1];
    }

    list->len--;

    return 0;
}



/* 按名字查找 */
int find_name_sql_list(sql_list *list, char *name)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 传入顺序表 长度 为 0
    if (0 >= list->len)
    {
        ERRLOG("数据表 的长度 为 0");
        return EOF;
    }

    // 开始查找
    for (size_t i = 0; i < list->len; i++)
    {
        if (!strcmp(list->data[i].name, name))
        {
            // 找到了
            return i + 1;
        }
    }


    // 没找到
    return EOF;
}

/* 按成绩查找 */

int find_soc_sql_list(sql_list * list , int soc , int * pos_s , int pos_s_len)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 传入顺序表 长度 为 0
    if (0 >= list->len)
    {
        ERRLOG("数据表 的长度 为 0");
        return EOF;
    }

    // 开始查找

    int num = 1;

    for (size_t i = 0; i < list->len; i++)
    {
        if ( list->data[i].sco == soc )
        {
            pos_s[0] = num;
            pos_s[num ++ ] = i;
        }
        if (num >= pos_s_len)
        {
            return 0;
        }
    }

    if (1 < num)
    {   
        // 找到了
        return 0;
    }
    // 没找到
    return EOF;
    
}

/* 更新顺序表 */
int Up_data_sql_list(sql_list *list, int pos)
{

    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    // 判断 传入顺序表 长度 为 0
    if (0 >= list->len)
    {
        ERRLOG("数据表 的长度 为 0");
        return EOF;
    }
    // 判定 pos 是否等于 -1 如果等于 -1 则代表没找到
    if (-1 == pos)
    {
        printf("没找到数据 pos = -1 \n");
        return EOF;
    }
    printf("---------- 原始数据 ----------\n");
    printf("姓名\t性别\t年纪\t学号\t成绩\n");
    printf("%s\t%s\t%d\t%d\t%d\n",
           list->data[pos - 1].name, list->data[pos - 1].sex, list->data[pos - 1].age,
           list->data[pos - 1].id, list->data[pos - 1].sco);
    printf("-----------------------------\n");

    //

    int num = 0;



    // 开始修改
    while (num != 6)
    {
        printf("1、姓名 2、性别 3、年纪 4、学号 5、成绩 6、退出");
        printf("请输入你要修改的选项:\n");
        scanf("%d", &num);

        switch (num)
        {
        case 1:
            printf("请输入姓名:");
            scanf("%s", list->data[pos - 1].name);
            break;
        case 2:
            printf("请输入性别:");
            scanf("%s", list->data[pos - 1].sex);
            break;
        case 3:
            printf("请输入年纪:");
            scanf("%d", &list->data[pos - 1].age);
            break;
        case 4:
            printf("请输入学号:");
            scanf("%d", &list->data[pos - 1].id);
            break;
        case 5:
            printf("请输入学号:");
            scanf("%d", &list->data[pos - 1].sco);
            break;
        case 6:
            printf("退出");
            break;
        default:
            break;
        }
    }

    return 0;
}




/* 判空 */
int IsEmpty_Sql_List(sql_list * list)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    if (0 == list->len)
    {
        // 为空
        return -1;
    }
    // 不为空
    return 0;
    
}

/* 清空 */
int Clear_Sql_List(sql_list * list)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return EOF;
    }

    list->len = 0;
    return 0;
}
/* 遍历顺序表 */
void printf_Sql_List(sql_list *list)
{
    // 判断 传入顺序表 为 NULL
    if (NULL == list)
    {
        ERRLOG("传入的数据 为 NULL");
        return;
    }

    printf("姓名\t性别\t年纪\t学号\t成绩\n");
    for (size_t i = 0; i < list->len; i++)
    {
        printf("%s\t%s\t%d\t%d\t%d\n",
               list->data[i].name, list->data[i].sex, list->data[i].age,
               list->data[i].id, list->data[i].sco);
    }
}
